import java.util.Arrays;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 19182
 * Date: 2025-10-18
 * Time: 9:36
 */
public class MybitSet {
    public byte[] elem;
    //有效元素个数
    public int usedSize;
    public MybitSet(){
        elem = new byte[1];
    }
    public MybitSet(int n){
        //当不能被8整除的时候多开1个字节，以便能放下12这种数字
        elem = new byte[n / 8 + 1];
    }
    public void set(int val){
        if(val < 0){
            throw new IndexOutOfBoundsException("数组下标越界");
        }
        int arrIndex = val / 8;
        //对原数组进行扩容并赋值
        if(arrIndex > elem.length - 1){
            elem = Arrays.copyOf(elem, arrIndex + 1);
        }
        int bitIndex = val % 8;
        //不能进行异或，如果bitIndex位置本身就是1就变成0了
        elem[arrIndex] |= (1 << bitIndex);
        usedSize++;
    }

    /**
     * 判断这个bit位的数字是否存在
     * @param val
     * @return
     */
    public boolean get(int val){
        if(val < 0){
            throw new IndexOutOfBoundsException("数组下标越界");
        }
        int arrIndex = val / 8;
        if(arrIndex > elem.length - 1){
            throw new IndexOutOfBoundsException("数组下标越界");
        }
        int bitIndex = val % 8;
        if((elem[arrIndex] & (1 << bitIndex)) != 0){
            return true;
        }
        return false;
    }

    /**
     * 把val的bitIndex位置设置0，表示删除了
     * @param val
     */
    public void reSet(int val){
        if(val < 0){
            throw new IndexOutOfBoundsException("数组下标越界");
        }
        int arrIndex = val / 8;
        if(arrIndex > elem.length - 1){
            throw new IndexOutOfBoundsException("数组下标越界");
        }
        int bitIndex = val % 8;
        //这里不能用异或，万一bitIndex位置本身就是0，那么不相同0异或1，不相同为1了(相同位0)
        elem[arrIndex] &= ~(1 << bitIndex);
        usedSize--;
    }
    public int getUsedSize(){
        return  usedSize;
    }
}
